home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Tools 3
/
Amiga Tools 3.iso
/
audio
/
beatmaster
/
beatmaster.s
< prev
Wrap
Text File
|
1995-06-19
|
5KB
|
209 lines
*****************************************************************
* *
* BeatMaster V0.1 -- BPM Zähler *
* *
*****************************************************************
*
* Von Richard Körber am 8. 9.1994
*
*****************************************************************
INCDIR "Include:"
INCLUDE exec.i
INCLUDE intuition.i
SECTION text,CODE
*---------------------------------------------------------------*
* EQUates definieren *
* *
;-- Farben -----------------------------;
GREY EQU 0 ;Standard-2.0-Farben
BLACK EQU 1
WHITE EQU 2
BLUE EQU 3
;-- Tag-Nummern ------------------------;
TAG_USER EQU $80000000
TAG_DONE EQU $00000000
;-- New-Window-Equates -----------------;
nw_Screen EQU 30
wd_UserPort EQU $56
CLOSEWINDOW EQU $0200
RAWKEY EQU $0400
WINDOWSIZING EQU 1
WINDOWDRAG EQU 2
WINDOWDEPTH EQU 4
WINDOWCLOSE EQU 8
SIZEBBOTTOM EQU $20
ACTIVATE EQU $1000
WBENCHSCREEN EQU $1
*---------------------------------------------------------------*
* == Start von WB == *
* *
start sub.l a1,a1
exec FindTask ;Task suchen
move.l d0,a4 ;Task in A4
tst.l 172(a4) ;pr_CLI prüfen
bne.b .nomessage
lea 92(a4),a0 ;^Port
move.l a0,-(sp)
exec WaitPort ;Auf Message warten
move.l (sp)+,a0
exec GetMsg ; und abholen
move.l d0,wbmessage
.nomessage bsr s
move.l wbmessage(PC),d7 ;Gab es eine?
beq.b .nowbm
exec Forbid
move.l d7,a1 ;Beantworten
exec ReplyMsg
;-- Alles klar -------------------------;
.nowbm moveq #0,d0 ;Kein Error
rts
*---------------------------------------------------------------*
* Los geht das Programm *
* *
s ;-- Lib öffnen -------------------------;
lea intuiname(PC),a1 ;Intuition öffnen
moveq #33,d0 ;ab Kick 1.2 erlaubt!!!
exec OpenLibrary
move.l d0,intuibase
;-- Window öffnen ----------------------;
lea newwindow(PC),a0
intui OpenWindow
move.l d0,window
move.l window(PC),a0 ;Nachricht
lea itxtmsg(PC),a1
moveq #0,d0 ;Offset X
moveq #0,d1 ;Offset Y
move.b $36(a0),d0
move.b $37(a0),d1
move.l $32(a0),a0 ;^RastPort
intui PrintIText
;-- Warte auf Message ------------------;
.nxtmsg move.l window,a0
move.l wd_UserPort(a0),a0 ;Port holen
move.l a0,-(sp)
exec WaitPort ;Warten
move.l (sp)+,a0
exec GetMsg ;Nachricht lesen
move.l d0,a1 ; kann nur Close sein
move.l $14(a1),d7 ;IDCMP merken
move.l $24(a1),d6 ; Seconds,
move.l $28(a1),d5 ; Micros natürlich auch
move $18(a1),d4 ;Key
swap d4
move $1a(a1),d4 ;Qualifier
exec ReplyMsg ;Message beantworten
;-- Message dekodieren -----------------;
cmp.l #CLOSEWINDOW,d7
beq.b exit
btst #23,d4 ;Keycode für KeyUp?
bne.b .nxtmsg ; dann nächstes Event
cmp #$0200,d4 ;Repeat?
beq.b .nxtmsg ; dann nächstes Event
move.l seconds(PC),d0 ;Delta berechnen
move.l micros(PC),d1
move.l d6,seconds
move.l d5,micros
sub.l d0,d6
sub.l d1,d5
bcc.b .isok
subq.l #1,d6 ;Sek -1
add.l #1000000,d5 ;µ + 1M
.isok divu #1000,d5 ;D5 kürzen auf 1000stel
swap d5 ;Rest interessiert nicht
clr d5
swap d5
mulu #1000,d6 ;Sek *100
add.l d5,d6 ;D6: 1000tel Sekunden
beq.b .flash
move.l #1000*60,d0
divu d6,d0 ;(100/100tel) * 60 = BPM
lea buffer(PC),a0 ;Wandeln
bsr bin2asc
move.l window(PC),a0
lea itxtbuff(PC),a1
moveq #0,d0 ;Offset X
moveq #0,d1 ;Offset Y
move.b $36(a0),d0
move.b $37(a0),d1
move.l $32(a0),a0 ;^RastPort
intui PrintIText
.flash move #$0800,$dff180 ;Screen kurz flashen
bra.w .nxtmsg
;-- Window schließen -------------------;
exit move.l window(PC),a0
intui CloseWindow
;-- Lib schließen ----------------------;
move.l intuibase(PC),a1
exec CloseLibrary
;-- Fertig -----------------------------;
moveq #0,d0 ;Alles OK
rts
*-------------------------------------------------------*
* bin2asc Wandelt Binär -> Ascii *
* -» A0.l ^Buffer (6 Bytes) *
* -» D0.w Zahl *
* *
bin2asc move.l #" ",(a0)+
move #" ",(a0)+
and.l #$ffff,d0 ;bereich einschränken
.loop divu #10,d0
swap d0
add.b #"0",d0
move.b d0,-(a0)
clr d0
swap d0
bne.b .loop
rts
*-------------------------------------------------------*
* Datenstrukturen, Variablen, Texte *
* *
wbmessage dc.l 0 ;^WB-Msg oder 0
intuibase dc.l 0 ;^Intuibase
window dc.l 0 ;^Window
seconds dc.l 0 ;letzte Seconds
micros dc.l 0 ;letzte Micros
buffer ds.b 6 ;EVEN
dc.b " BPM (Beats Per Minute)",0
even
;-- Intui Text -------------------------;
itxtbuff dc.b BLACK,GREY,1,0
dc.w 10,3
dc.l 0,buffer,0
itxtmsg dc.b BLUE,GREY,1,0
dc.w 25,14
dc.l 0,.txt,0
.txt dc.b "hit any key at every beat...",0
even
;-- NewWindow-Struktur -----------------;
newwindow dc.w 50 ; nw_LeftEdge
dc.w 25 ; nw_TopEdge
dc.w 300 ; nw_Width
dc.w 40 ; nw_Height
dc.b GREY ; nw_DetailPen
dc.b BLACK ; nw_BlockPen
dc.l CLOSEWINDOW!RAWKEY ; nw_IDCMPFlags
dc.l WINDOWDRAG!WINDOWDEPTH!WINDOWCLOSE!ACTIVATE
dc.l 0 ; nw_FirstGadget
dc.l 0 ; nw_CheckMark
dc.l wndtitle ; nw_Title
dc.l 0 ; nw_Screen (nachgetragen)
dc.l 0 ; nw_BitMap
dc.w 0,0 ; nw_MinWidth Height
dc.w 0,0 ; nw_MaxWidth Height
dc.w WBENCHSCREEN ; nw_Type
;-- Texte ------------------------------;
wndtitle dc.b 'BeatMaster V0.1 by R.Körber',0
intuiname dc.b 'intuition.library',0
*---------------------------------------------------------------*
* Fertig *
* *
END